DLLって何?

1998/10/17
Q:(一郎兄さん)
 のぶさん、よくDLL(ディーエルエル)って聞くけど、これ何?。

A:(延さん)
 Dynamic Link Library(ダイナミックリンクライブラリ)のことです。

Q:(一郎兄さん)
 ダイナミックリンクライブラリ(動的結合ライブラリ)

A:(延さん)
 そうです。ライブラリって図書館のことですよね。図書館とはが沢山納められているところですね。実はダイナミックリンクライブラリもあるものが沢山入っているところ(ファイル)なんです。さて何が入っていると思いますか?

Q:(憲さん)
 「ダイナミックリンク」が沢山入っているのではないですか?

A:(延さん)
 残念! 「ダイナミックリンク(動的結合)」というのはDLLに入っているものではなくて、このライブラリの性格を表しているものです。これに対するものとしてスタティックリンク(静的結合)ライブラリというライブラリもあります。これに付いては後述します。

 実際DLLという図書館に沢山収めれているものはプログラムなんです。

Q:(貴子)
 プログラム

A:(延さん)
 そう、プログラムです。この場合はある処理と言ってもいいかもしれません。それも皆が使う、とてもよくできた有用な処理(プログラム)が沢山収められています。

Q:(憲さん)
 プログラムというのは拡張子が「EXE」のファイルではなかったのですが?

A:(延さん)
 確かにEXEファイルプログラムです。しかしDLLにもプログラムが入っています。EXEファイルとDLLファイルの違いは、EXEファイルのEXEとは「execute(実行する)」のことで、これが示すように、それ自身実行可能なプログラムですが、DLLは自身では実行できないプログラムなのです。この話がどういうことを言っているのかは、非常に難しい概念なのでここでは説明しません。
 簡単に説明するとすれば、プログラムをにたとえると、DLLはエンジンだけで、EXEファイルはエンジンのほかにハンドルやミッションなどもある完全な車。エンジンは車にとって心臓部ではあるけれど、所詮それだけでは車は動かないという話。

 あとEXEファイルとDLLファイルの違いで重要なのが、DLLには皆がよく使う汎用的な処理(プログラム)が収められているということです。たとえば「画面に表示する」とか「ファイルを読み込む」とか、どのようなアプリケーションソフトでも使うような処理を格納しています。これに対しEXEファイルには基本的にそのアプリケーションソフトに特化したプログラムが書かれているのが普通です。それゆえアプリケーション(応用)プログラムと呼ばれる訳です。

 またDLLファイルは、そこに格納されているプログラムを外部のEXEファイルから使えるようになっています。皆が必要な処理(プログラム)を格納し、それを皆が使えるようにしてある訳ね。一方EXEファイル内のプログラム(処理)は外側から他のプログラムが使うことができるようにはなっていません。

下にダイナミックリンクライブラリの動作イメージを示します。

[ダイナミックリンクライブラリの動作イメージ]
ダイナミックリンクライブラリの動作イメージ  図にはダイナミックリンクライブラリと3つのアプリケーションプログラム(メモ帳、電卓、レジストリエディタ)があります。それぞれの中に四角で囲まれているのが「プログラム(処理)」です。ダイナミックリンクライブラリには「Window表示」「メニュー操作」「ファイル読込み」の3つのプログラム(処理)が格納されています。いずれも汎用的で多くの人が必要とする処理であり、実際利用できるような仕組みになっています。

 一方3つのアプリケーションプログラムには、それぞれのプログラムの働きに特化した処理(プログラム)が含まれています。そしてそのアプリケーションプログラムからダイナミックリンクライブラリ内の各プログラムを参照、利用しているイメージが掴めるでしょうか。

 メモ帳を例にとると、実際メモ帳の機能を実現するにはプログラムとし「Windows表示」「文字の変換」「行の削除」「メニュー操作」「ファイル読込み」などの処理が必要なのですが、「Window表示」「メニュー操作」「ファイル読込み」の3つのプログラムに関してはダイナミックリンクライブラリ内のプログラムを使うことでまかなう訳ですね。

Q:(貴子)
 DLLファイルは本当にプログラムの図書館のような働きをしているのね。

A:(延さん)
 そうだね。このようなプログラムの図書館を作る目的には次のようなものがあります。

 (1)のプログラマの負担軽減が一番重要です。既に誰かが作ったプログラム、それも非常によく出来ていて、その動作も安定しており、その優秀さが実証されているようなプログラムを誰もが使えたらとても便利ですよね。これを実現するために、いくつかのプログラムを一つのファイルに格納し、ここに格納されたプログラムを部品として他のプログラムから使えるような仕組みがライブラリである訳です。

 これによって多くのプログラマは、自ら作らないでも、すばらしいプログラム(処理)を使うことができるようになりました。このような仕組み無くしては、今日のソフトウェアの発展はありえなかったと言える程重要なことです。

 先ほどの図で「電卓」を例に話すと、「電卓」を作ろうとするプログラマは、本来、「Windows表示」「√の計算」「三角関数」「メニュー操作」などのプログラムを作る必要があるのですが、「Window表示」「メニュー操作」の2つのプログラムに関してはダイナミックリンクライブラリ内の出来合いのプログラムを使うことができるので、作る必要がない訳ですね。

 しかしこの考え方は、別にソフトウェアに限ったことではないと思います。だれかがある有用なものを作った場合、それは世の中に提供され、利用されます。誰かがいいタイヤを発明したら、を作る人はそのタイヤを部品として購入すればよく、自分でタイヤをまた発明する必要はありません。このようにある人が苦労して作ったものが、その社会の資産として蓄積され、利用されていくのは、どこの世界にもあり、これによって人間の社会は発展してきたわけです。

 ソフトウェアの場合もそのような社会の発展の仕組みに従って来たということです。例としてWindowsでの話をすれば、例えばタイトルバーの表示とかメニュー動作とかいったものはアプリケーションのプログラマは、提供されたDLLに収められたプログラムを使うだけで実現できます。いちいちタイトルバーやメニューを表示するプログラムを自ら考え、作る必要はないのです。

Q:(貴子)
 ソフトウェアの発展には欠かせなかった技法だったということがよく分かるわ。

A:(延さん)
 そうだろ。いいものはみんなで使う、これ社会の常識という訳。

 次に(2)のディスクスペースやメモリの節約ですが、これはライブラリでもダイナミックリンクライブラリだけの特徴です。先ほどちょっと出てきたライブラリのもう一つの種類スタティックリンク(静的結合)ライブラリにはこのメリットがありません。実はライブラリの歴史としてはこのスタティックリンクライブラリの方が古いのです。

[スタティックリンク(静的結合)のイメージ]
スタティックリンク(静的結合)のイメージ  ここでスタティックリンク(静的結合)ライブラリのこともちゃんと説明しておく必要がありますね。

 先ほど車とタイヤの例をあげましたが、この例はライブラリに当てはめた場合はダイナミックリンクライブラリではなく、スタティックリンクライブラリに適合します。もし3台の車を作る場合、タイヤは3台分必要ですよね。これはタイヤは車の一部として一体となる必要があるからです。後で返す目的で借りてきて使うという訳にはいきません。タイヤの作り方を知る必要もないし、さらに自ら作る必要はないとはいえ、物は3台分用意する必要があります。

 スタティックリンクライブラリの場合も同じで、図で示すように、それを利用する人(そのライブラリを利用するアプリケーションプログラムを作るプログラマ)は、そのライブラリを持ってきて(コピーして)自分のプログラム(アプリケーションプログラム)に静的に結合して使います。ライブラリはアプリケーションプログラムと結合して一体となってしまいます。ですからライブラリの実体としてはそれを必要とするアプリケーションプログラムの数だけ必要になり、その分しっかりとディスクスペースを占有することになります。

 一方ダイナミックリンクライブラリは違います。あるライブラリを必要とするアプリケーションプログラムは実行時にそのライブラリを動的に結合して使えるようになっています。私は「結合」といいました。通常「リンク」「結合」と訳しますが、これはスタティックリンクと合わせているためで、実際はダイナミックリンクの場合は「結合」するというよりは、単に「関係づけされる」というイメージで、実際実行時に「参照する」だけといったニュアンスです。

 それゆえという訳でもないですが、同じライブラリを複数のアプリケーションプログラムが同時に使える(参照できる)ようにもなっています。ソフトウェアならではの使い方なので、物理世界では適切な例をちょっと示せませんが、まあ同じ本一度にみんなで読んでいるイメージでしょうか。従ってそのライブラリを必要とするアプリケーションプログラムがいくつあろうとも、ディスク上にもメモリ上にもライブラリは一つで済みます。

 現在のWindowsの場合、このシステムが無ければ、今の軽く数十倍はファイルが必要だったでしょう。ハードディスクもメモリのそれだけ必要になってしまうということです。

Q:(憲さん)
 省スペースにとって非常に重要な機能だということですね。

A:(延さん)
 そうだね。さて最後のアップグレードの容易さだけど、これもダイナミックリンクライブラリならではの特徴で、スタティックリンクライブラリにはないメリットです。

 先ほどの車とタイヤの例で、もしタイヤに欠陥が見つかったり、より性能が改善されたとして、タイヤが修理されたり、改良されたとしましょう。しかし既に車には前のタイヤが使われている訳ですから、それを新しいタイヤに交換しない限り、不具合の修正や、改良の恩恵を受けることはできません。

 スタティックリンクライブラリの場合も同じです。もしあるライブラリ内のプログラムに不具合があって、それが修正されたり、プログラムの機能改善が行われたとしても、それをリンクしたアプリケーションプログラムは以前の古いライブラリが静的にリンクされて、一体となってしまっているのですから、新しいライブラリの修正や改良を反映させるには、このライブラリをまた持ってきて、もう一度アプリケーションプログラムとのリンクを行わなければなりません。アプリケーションプログラム側も作り直す必要があるということです。

 実はこれは大変な作業になります。 通常アプリケーションプログラムはそれぞれ作る人や会社が違います。またライブラリを提供する会社も違います。ライブラリを修正したソフト会社が、このライブラリを使っている全てのプログラマやソフト会社にこれを再配布し、それらの会社が自分のアプリケーションプログラムを作り直し、ユーザにもう一度配り直すことを考えてみてください。使っているアプリケーションプログラムが2つ3つなら問題ないかもしれませんが、現実には100や200は普通です。到底不可能と言わざるを得ません。

 ところがダイナミックリンクライブラリの場合は、アプリケーションプログラムと静的に一体となってしまっている訳ではないですから、ライブラリだけを差し替えておけば、簡単に修正や改良を反映させることができます。アプリケーションソフト側は一切触る必要がありません。アプリケーションからすれば、実行時に実際読んでみたら、「あら、変わってた」という程度です。

 実際Windowsなどでもサービスパックと呼ばれる修正プログラムが出ることがありますが、このような手法で修正されるので、マイクロソフトが提供するDLLを差し替えるだけで不具合の修正が可能な訳ですね。最近インターネット時代になり、修正ライブラリの配布が容易になったので、このメリットがより重要になってきていると思います。

 みなさん、DLL(ダイナミックリンクライブラリ)って何だかよく分かりましたか?

Q:(初心者の皆さん)
 はーいっ!


戻る

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!